package dao;

import anno.Component;
import pojo.Movie;
import utils.JDBCUtils;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component

public class MovieDAO extends AbstractBaseDao<Movie> {

    /**
     * 分页模糊查询电影
     *
     * @param keyword  模糊查询关键字
     * @param pageNum  当前页码
     * @param pageSize 每页记录数
     * @return 分页查询结果
     * @throws SQLException SQL异常
     */
    public Map<String, Object> findMoviesByPageAndTitle(String keyword, int pageNum, int pageSize) throws SQLException {
        String sql = "SELECT * FROM tb_movies WHERE title LIKE ?";
        return findByPageAndKeyword(sql, keyword, pageNum, pageSize);
    }

    /**
     * 根据电影标题查询电影
     *
     * @param title 电影标题
     * @return 符合条件的电影列表
     * @throws SQLException SQL异常
     */
    public List<Movie> findByTitle(String title) throws SQLException {
        return findByField("title", title);
    }

    /**
     * 根据电影评分查询电影
     *
     * @param rating 电影评分
     * @return 符合条件的电影列表
     * @throws SQLException SQL异常
     */
    public List<Movie> findByRating(Float rating) throws SQLException {
        return findByField("rating", rating);
    }

    /**
     * 根据上映日期查询电影
     *
     * @param releaseDate 上映日期
     * @return 符合条件的电影列表
     * @throws SQLException SQL异常
     */
    public List<Movie> findByReleaseDate(LocalDateTime releaseDate) throws SQLException {
        return findByField("releaseDate", releaseDate);
    }

    /**
     * 根据电影时长查询电影
     *
     * @param duration 电影时长
     * @return 符合条件的电影列表
     * @throws SQLException SQL异常
     */
    public List<Movie> findByDuration(Integer duration) throws SQLException {
        return findByField("duration", duration);
    }

    /**
     * 分页模糊查询电影的辅助方法
     *
     * @param sql      查询SQL
     * @param keyword  模糊查询关键字
     * @param pageNum  当前页码
     * @param pageSize 每页记录数
     * @return 分页查询结果
     * @throws SQLException SQL异常
     */
    private Map<String, Object> findByPageAndKeyword(String sql, String keyword, int pageNum, int pageSize) throws SQLException {
        int offset = (pageNum - 1) * pageSize;
        String countSql = "SELECT COUNT(*) FROM (" + sql + ") tmp";
        String querySql = sql + " LIMIT ?, ?";

        // 查询符合条件的电影总数
        ResultSet rsCount = (ResultSet) JDBCUtils.execute(countSql, "%" + keyword + "%");
        int totalRecords = 0;
        if (rsCount.next()) {
            totalRecords = rsCount.getInt(1);
        }

        // 查询符合条件的电影列表
        ResultSet rsQuery = (ResultSet) JDBCUtils.execute(querySql, "%" + keyword + "%", offset, pageSize);
        List<Movie> movieList = new ArrayList<>();
        while (rsQuery.next()) {
            movieList.add(mapResultSetToEntity(rsQuery));
        }

        // 将数据和总记录数封装到Map中
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("data", movieList);
        resultMap.put("total", totalRecords);

        return resultMap;
    }
}